package io.renren.common.utils;

import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期处理
 *
 * @author Mark sunlightcs@gmail.com
 */
@Slf4j
public class DateUtils {
    /**
     * 时间格式(yyyy-MM-dd)
     */
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    /**
     * 时间格式(yyyy-MM-dd HH:mm:ss)
     */
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 日期格式化 日期格式为：yyyy-MM-dd
     *
     * @param date 日期
     * @return 返回yyyy-MM-dd格式日期
     */
    public static String format(Date date) {
        return format(date, DATE_PATTERN);
    }

    /**
     * 日期格式化 日期格式为：yyyy-MM-dd
     *
     * @param date    日期
     * @param pattern 格式，如：DateUtils.DATE_TIME_PATTERN
     * @return 返回yyyy-MM-dd格式日期
     */
    public static String format(Date date, String pattern) {
        if (date != null) {
            SimpleDateFormat df = new SimpleDateFormat(pattern);
            return df.format(date);
        }
        return null;
    }

    /**
     * 日期解析
     *
     * @param date    日期
     * @param pattern 格式，如：DateUtils.DATE_TIME_PATTERN
     * @return 返回Date
     */
    public static Date parse(String date, String pattern) {
        try {
            return new SimpleDateFormat(pattern).parse(date);
        } catch (ParseException e) {
            log.error("时间转换出错", e);
        }
        return null;
    }

    /**
     * 获取两个时间相差天数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 相差天数
     */
    public static long getDaysBetween(Date startTime, Date endTime) {
        return DateUtil.betweenDay(startTime, endTime, true);
    }

    /**
     * 获取两个时间相差月份数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 相差月份数
     */
    public static long getMonthsBetween(Date startTime, Date endTime) {
        return DateUtil.betweenMonth(startTime, endTime, true);
    }

    /**
     * 获取两个时间相差年数
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 相差年数
     */
    public static long getYearsBetween(Date startTime, Date endTime) {
        return DateUtil.betweenYear(startTime, endTime, true);
    }

    /**
     * 根据日期取得星期几
     *
     * @param date 时间
     * @return 周几
     */
    public static String getWeek(Date date) {
        return DateUtil.dayOfWeekEnum(date).toChinese("周");
    }

    /**
     * 获取某一天的结束时间
     *
     * @param date 时间
     * @return 某一天的结束时间
     */
    public static Date getEndTimeForDate(Date date) {
        if (null == date) {
            return null;
        }
        return DateUtil.endOfDay(date);
    }

    /**
     * 获取某一天的开始时间
     *
     * @param date 时间
     * @return 某一天的开始时间
     */
    public static Date getStartTimeForDate(Date date) {
        if (null == date) {
            return null;
        }
        return DateUtil.beginOfDay(date);
    }

    public static void main(String[] args) {
        System.out.println(getWeek(new Date()));
        System.out.println(getStartTimeForDate(new Date()));
        System.out.println(getEndTimeForDate(new Date()));
    }
}
